<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <canvas id="canvas" style="border: 1px solid red"></canvas>
    <canvas id="cas" style="border: 1px solid red"></canvas>
    <script>
      const canvas = document.getElementById("canvas");
      const ctx = canvas.getContext("2d");

      ctx.fillStyle = "red";
      ctx.fillRect(10, 10, 100, 50);

      ctx.beginPath();
      ctx.moveTo(70, 70);
      ctx.lineWidth = 1;
      ctx.strokeStyle = "black";
      ctx.lineTo(70, 150);
      ctx.stroke();
      ctx.closePath();

      ctx.beginPath();
      ctx.moveTo(70, 70);
      ctx.lineWidth = 1;
      ctx.strokeStyle = "black";
      ctx.lineTo(300, 70);
      ctx.stroke();
      ctx.closePath();

      ctx.arc(70, 70, 2, 0, 2 * Math.PI);
      ctx.fill();

      // 移动到 70,70 下次绘制从该点开始
      ctx.translate(70, 70);
      ctx.fillStyle = "lightblue";
      ctx.fillRect(0, 0, 50, 50);

      // 旋转 45 度
      ctx.rotate((Math.PI / 180) * 45);
      ctx.fillStyle = "yellow";
      ctx.fillRect(0, 0, 50, 50);

      // 清除平移和旋转
      ctx.resetTransform();
      ctx.font = "12px Arial";
      ctx.fillStyle = "black";
      ctx.textAlign = "center";
      ctx.textBaseline = "middle";
      ctx.fillText("旋转45度", 70, 70 + Math.sqrt(5000) / 2);

      // 再次移动到 70,70
      ctx.translate(70, 70);

      ctx.strokeStyle = "lightgray";
      ctx.strokeRect(60, 0, 50, 50);

      // 放大两倍
      ctx.scale(2, 2);
      ctx.strokeStyle = "lightblue";
      ctx.strokeRect(60, 0, 50, 50); // 实际变成（70+60*2, 70, 100, 100）

      // 矩阵变换
      {
        const canvas = document.getElementById("cas");
        const ctx = canvas.getContext("2d");

        // 将左上角矩形变换到右下角
        // 创建渐变矩形
        const linearGradient = ctx.createLinearGradient(0, 0, 50, 0);
        linearGradient.addColorStop(0, "red");
        linearGradient.addColorStop(0.5, "green");
        linearGradient.addColorStop(1, "blue");
        ctx.fillStyle = linearGradient;
        ctx.fillRect(0, 0, 50, 50);

        // 定义矩阵变换
        // 90 度旋转
        const angle = (90 * Math.PI) / 180;
        ctx.transform(
          Math.cos(angle), // a (x方向的缩放和旋转)
          Math.sin(angle), // b (y方向的剪切和旋转)
          -Math.sin(angle), // c (x方向的剪切和旋转)
          Math.cos(angle), // d (y方向的缩放和旋转)
          canvas.width,
          canvas.height - 50
        );
        ctx.fillRect(0, 0, 50, 50);
      }
    </script>
  </body>
</html>
